1 module geany_dlang.config_window;
2 
3 import gtk.Widget: GtkWidget, GtkDialog;
4 import geany_d_binding.geany.plugins;
5 import geany_d_binding.geany.types;
6 import logger: nothrowLog;
7 import geany_dlang.plugin: configFile;
8 import gtk.Builder;
9 
10 extern(System) GtkWidget* configWindowDialog(GeanyPlugin* plugin, GtkDialog* dialogPtr, gpointer pdata) nothrow
11 {
12     import geany_dlang.config;
13     import gtk.Box;
14     import gtk.TreeView;
15     import gtk.CellRendererText;
16     import gtk.Dialog;
17     import gobject.Signals;
18 
19     nothrowLog!"trace"(__FUNCTION__);
20 
21     try
22     {
23         immutable guiDescr = import("preferences.glade");
24         auto builder = new Builder();
25         builder.addFromString(guiDescr);
26 
27         fillPrefsFromConfig(builder);
28 
29         auto pathCellRenderer = cast(CellRendererText) builder.getObject("path_cell_renderer");
30         pathCellRenderer.addOnEdited(
31             (string position, string val, CellRendererText cell)
32             {
33                 import gtk.TreePath;
34                 import gtk.TreeIter;
35 
36                 auto path = new TreePath(position);
37                 auto list = builder.getPathsList;
38                 auto iter = new TreeIter(list, path);
39                 list.setValue(iter, COLUMN_PATH, val);
40             }
41         );
42 
43         auto box = cast(Box) builder.getObject("main_box");
44         box.showAll;
45 
46         void on_configure_response(int response, Dialog d)
47         {
48             const r = cast(GtkResponseType) response;
49 
50             if (r == GtkResponseType.OK || r == GtkResponseType.APPLY)
51             {
52                 nothrowLog!"trace"("Save config");
53 
54                 savePrefsToConfig(builder);
55                 configFile.saveConf();
56 
57                 import geany_dlang.plugin;
58                 wrapper.substituteDcdPaths(configFile.config.additionalPaths);
59             }
60         }
61 
62         auto dialog = new Dialog(dialogPtr);
63         dialog.addOnResponse(&on_configure_response);
64 
65         return cast(GtkWidget*) box.getBoxStruct;
66     }
67     catch(Exception e)
68     {
69         nothrowLog!"fatal"(e);
70 
71         return null;
72     }
73 }
74 
75 import gtk.ListStore;
76 
77 private enum
78 {
79     COLUMN_ENABLED,
80     COLUMN_PATH,
81 }
82 
83 import gtk.ToggleButton;
84 
85 private auto getCharAddCheckBox(Builder b)
86 {
87     return cast(ToggleButton) b.getObject("capture_charadded_checkbox");
88 }
89 
90 private auto getPathsList(Builder b)
91 {
92     return cast(ListStore) b.getObject("dir_list_store");
93 }
94 
95 private void fillPrefsFromConfig(Builder b)
96 {
97     b.getCharAddCheckBox.setActive = configFile.config.useCharAddEvent;
98 
99     auto list = b.getPathsList;
100     list.clear;
101 
102     foreach(path; configFile.config.additionalPaths)
103     {
104         auto iterator = list.createIter();
105         list.setValue(iterator, COLUMN_PATH, path);
106     }
107 }
108 
109 private void savePrefsToConfig(Builder b)
110 {
111     configFile.config.useCharAddEvent = b.getCharAddCheckBox.getActive;
112 
113     configFile.config.additionalPaths.length = 0;
114 
115     auto list = b.getPathsList;
116 
117     auto iterator = list.createIter;
118     list.getIterFirst(iterator);
119     iterator.setModel(list);
120 
121     do {
122         configFile.config.additionalPaths ~= iterator.getValueString(COLUMN_PATH);
123     }
124     while(list.iterNext(iterator));
125 
126     // removes latest null string
127     configFile.config.additionalPaths = configFile.config.additionalPaths[0 .. $-1];
128 }